" ===
" === System
" ===
set nocompatible  "不与 vi 兼容（采用 vim 自己的操作命令）
filetype on  "打开 vim 对基于文件类型的支持
filetype indent on  "允许 vim 为不同类型的文件定义不同的缩进格式，并且载入与该类型对应的缩进规则
filetype plugin on  "允许 vim 加载文件类型插件
"filetype plugin indent on  "等于上面三条命令
"启用鼠标
set mouse=a
set selection=exclusive
set selectmode=mouse,key
"设置编码
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8

set clipboard=unnamed

" Prevent incorrect backgroung rendering
let &t_ut=''

" ===
" === Main code display
" ===
set number  "显示行号
set relativenumber  "显示光标所在的当前行的行号，其他行都为相对于该行的相对行号
set ruler  "在状态栏显示光标的当前位置（位于哪一行哪一列）
set cursorline  "光标所在的当前行高亮
syntax enable  "启用语法高亮度
syntax on  "打开语法高亮。自动识别代码，使用多种颜色显示

" ===
" === Editor behavior
" ===
" Better tab
set expandtab  "由于 Tab 键在不同的编辑器缩进不一致，该设置自动将 Tab 转为空格
set tabstop=2  "按下 Tab 键时，Vim 显示的空格数
set shiftwidth=2  "按下 Tab 键时，Vim 显示的空格数
set softtabstop=2  "Tab 转为多少个空格
"显示空格和 tab 键
set list
set listchars=tab:─▸,trail:▸  "如果行尾有多余的空格（包括 Tab 键），该配置将让这些空格显示成可见的小方块

set scrolloff=25  "垂直滚动时，光标距离顶部/底部的位置（单位：行）

" Prevent auto line split
set wrap  "自动折行，即太长的行分成几行显示
set textwidth=0  "使用:verbose set textwidth 命令可以看到 vim 默认设置了 textwidth 为78,当输入超过78个字符并按下空格键时会自动换行, 将textwidth设成0关闭该功能

set indentexpr=  "缩进方式
" Better backspace
set backspace=indent,eol,start

set foldmethod=indent  "代码折叠，使用zc按键来创建折叠，使用za来打开或者关闭折叠
set foldlevel=99

"设置不同模式下光标的形状
let &t_SI = "\<Esc>]50;CursorShape=1\x7"
let &t_SR = "\<Esc>]50;CursorShape=2\x7"
let &t_EI = "\<Esc>]50;CursorShape=0\x7"

" ===
" === Window behaviors
" ===
set splitright  "新分割窗口在右边
set splitbelow  "新分割窗口在下边

" ===
" === Status/command bar
" ===
set laststatus=2  "是否显示状态栏。0 表示不显示，1 表示只在多窗口时显示，2 表示显示
set autochdir  "自动切换工作目录。这主要用在一个 Vim 会话之中打开多个文件的情况，默认的工作目录是打开的第一个文件的目录。该配置可以将工作目录自动切换到，正在编辑的文件的目录。
set showcmd  "命令模式下，在底部显示，当前键入的指令。比如，键入的指令是2y3d，那么底部就会显示2y3，当键入d的时候，操作完成，显示消失。
set formatoptions-=tc

" Show command autocomplete
set wildignore=log/**,node_modules/**,target/**,tmp/**,*.rbc
set wildmenu                                                 " show a navigable menu for tab completion
set wildmode=longest,list,full  "vim 的 tab 命令自动补全

" Searching options
set hlsearch  "搜索时，高亮显示匹配结果
exec "nohlsearch"
set incsearch  "输入搜索模式时，每输入一个字符，就自动跳到第一个匹配的结果
set ignorecase  "搜索时忽略大小写
set smartcase  "如果同时打开了ignorecase，那么对于只有一个大写字母的搜索词，将大小写敏感；其他情况都是大小写不敏感。比如，搜索Test时，将不匹配test；搜索test时，将匹配Test。


" ===
" === Restore Cursor Position
" ===
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif


" ===
" === Markdown Settings
" ===
" Snippets
source $HOME/.config/nvim/md-snippets.vim
" auto spell
"autocmd BufRead,BufNewFile *.md setlocal spell

" Auto change directory to current dir
autocmd BufEnter * silent! lcd %:p:h

" set wrap
noremap <LEADER>sw :set wrap<CR> "长行显示自动折行